I2Cインターフェースの
EEPROM読み書き
(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード)
I2CインターフェースのEEPROMの読み書きの例を紹介します。 ここでは 結果表示用の液晶もI2Cインターフェースの液晶とし、同一のSCL、SDAの
ラインに接続しています。
<仕様>
・PIC32MZに、I2CインターフェースのEEPROM 24LC64(64kビット)を接続し読み書きを行う。
・読み出した文字の表示用液晶として I2Cインターフェースの 秋月電子通商のACM1602NI(16文字 x2列)を用い
同じSCL、SDAのラインに接続する。
・PIC32MZが起動したら EEPROMに以下の文字列を書き込む。 文字列の終端には制御文字\rを付加する。
先頭アドレス 文字列
0x0000 "Are you Betty?\r"
0x0020 "Yes,I am Betty\r"
0x0040 "Is this a pen?\r"
0x0060 "No. It's a book\r"
・PIC32MZ起動後、液晶に以下を表示する。
1行目 …… "I2C LCD"
2行目 …… "Start !!"
・ その後、 EEPROMから 以下のモード①とモード②を2秒毎に切り替え、これを繰り返す
モード①
液晶表示
1行目 …… "Are you Betty?"
2行目 …… "Yes,I am Betty"
LED x4個 …… 点灯
モード②
液晶表示
1行目 …… "Is this a pen?"
2行目 …… "No. It's a book"
LED x4個 …… 消灯
・ I2C
Harmony …… スタティックライブラリ
モジュール …… I2C2
転送クロック周波数 …… 100kHz
アドレス方式 …… 7ビット
チップアドレス配置 …… 液晶ACM1602Nのチップアドレス(既定): b2=0、b1=0、 b0=0
EEPROM 24LC64のチップアドレス: b2=1、b1=0、b0=0(端子接続 → A2 =
+3.3v 、A1 = GND、A0 = GND)
<回路図> (→ PDFファイル)
<外観>PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。
汎用モジュール評価ボード(段積みボード)には本テーマと関係ない部品が多々実装されています。
<動作結果> (→ 動画:1080pのHD動画を見ることができます。)
PIC32MZ起動後の LCD画面 |
<繰り返しサイクル> | |
LEDがONした場合の LCD画面 & LED x4 :ON |
LEDがOFFの場合の LED画面 & LED x4 :OFF |
|
<解説>記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
(以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なる点があるかもしれませんので注意してください。)
■ MHC設定
■Options
■ Pin Settings
■ プロジェクトに I2Cインターフェース用液晶表示のライブライ関数 lcd_ACM1602_lib_i2c.h と lcd_ACM1602_lib_i2c.c を追加します。
そして、EEPROM 24LC用の読み書き用ライブラリ関数 mem_24LC_lib_i2c.h と mem_24LC_lib_i2c.cも追加します。
① lcd_ACM1602_lib_i2c.h と lcd_ACM1602_lib_i2c.c 及びmem_24LC_lib_i2c.h と mem_24LC_lib_i2c.cを main.cがあるフォルダにコピーします。
② プロジェクトに追加します。
③ ダウンロードされるファイルは SPIモジュールがSPI2の場合のものです。 ここでは修正の必要はありませんが
他のモジュールを使用する場合は青字部分を修正します。
以下、lcd_ACM1602_lib_i2c.h
以下、lcd_ACM1602_lib_i2c.c
以下、mem_24LC_lib_i2c.h
以下、mem_24LC_lib_i2c.c
■ app.cに、青字部分を追加します。
① stdio.h、lcd_ACM1602_lib_i2c.h、mem_24LC_lib_i2c.h をインクルードします。
#include "stdio.h"
#include "lcd_ACM1602_lib_i2c.h"
#include "mem_24LC_lib_i2c.h"
② mem_24LC_lib_i2c.cの中で定義されている文字列送受信バッファのグローバル変数char read_data[20]をapp.cで宣言
extern char read_data[20]; //I2C受信文字列データ用
③ EEPROMへの書き込み文字列を定義する。文字列の終端にI2C送受信では\n(0x00は使えないので \rを付加し文字列の
終端検出に用いる。
char Betty_Q[] = "Are you Betty?\r"; //I2Cでは 文字列終端の'\0'(0x00)は送受信データとして使えないことから
//代用として'\r'(0x0d 復帰)を用いる
char Betty_A[] = "Yes,I am Betty\r"; //
char Pen_Q[] = "Is this a pen?\r"; //
char Pen_A[] = "No. It's a book\r"; //
④ NOPを利用した μsec、msecの遅延関数 delay_usec( )、delay_ms( ) を定義する。
void delay_us(volatile unsigned int usec) //1μsec遅延
{
volatile int count;
count = (int)(delay_Clock/20000000)*usec;
……
……
⑤ APP_Initialize ( )の中で EEPROM 24LC64の番地0x00、0x20、0x40、0x60に所要の文字列を書き込む
mem24LC_WriteStr(Adr_chips,0x0000,Betty_Q);
mem24LC_WriteStr(Adr_chips,0x0020,Betty_A);
mem24LC_WriteStr(Adr_chips,0x0040,Pen_Q);
mem24LC_WriteStr(Adr_chips,0x0060,Pen_A);
⑥ その後、液晶ACM1602NIを初期化して、 1行目に"I2C LCD "を 2行目に" Start !!
"を表示する。
lcd_ACM1602_init_i2c(); //I2Cインターフェース式液晶初期化
lcd_ACM1602_cmd_i2c(0x0C); //カーソル:0FF、ブリンク:0FF
lcd_ACM1602_cmd_i2c(0x80); //1行目の先頭へ
lcd_ACM1602_str_i2c("I2C LCD ");
lcd_ACM1602_cmd_i2c(0xC0); //2行目の先頭へ
lcd_ACM1602_str_i2c(" Start !! ");
⑦ APP_Tasks ( )のcase APP_STATE_SERVICE_TASKS:の中に
4個のLEDを点灯し、所要のEEPROMアドレスから読み出して液晶ACM1602NIの1行目に"Are you Betty?"、
2行目に "Yes,I am Betty"を表示する。
mem24LC_ReadStr(Adr_chips, 0x0000);
str_read = &read_data[0];
lcd_ACM1602_cmd_i2c(0x80); //1行目の先頭へ
sprintf(Buf,"%s ",str_read); //
lcd_ACM1602_str_i2c(Buf);
……
……
⑧ 2秒経過後、4個のLEDを消灯し、所要のEEPROMアドレスから読み出して液晶ACM1602NIの1行目に
"Is this a pen?"、2行目に "No. It's a book" を表示する。
mem24LC_ReadStr(Adr_chips, 0x0040);
str_read = &read_data[0];
lcd_ACM1602_cmd_i2c(0x80); //1行目の先頭へ
sprintf(Buf,"%s ",str_read); //
lcd_ACM1602_str_i2c(Buf);
……
……
以下、app.c